import FightAttri from 'server/model/fightAttri';
import partnerModel from 'server/model/partnerModel';
import {
    totalConfig,
    propName
} from 'server/config/templateConfig';
let partnersConfig = totalConfig.partner;
let baseConfig = totalConfig.base;
let baseAttriConfig = baseConfig.attri;

class PartnerHandle {
    static getInstance() {
        if (!PartnerHandle.instance) {
            PartnerHandle.instance = new PartnerHandle();
        }
        return PartnerHandle.instance;
    }

    createPartner(templateId) {
        let partner = this.initAttri({
            templateId: templateId
        });
        partner.fightAttri.hp = partner.fightAttri.maxHp;
        return partner;
    }

    initAttri(partner) {
        partner = partnerModel.create(partner);
        partner.fightAttri = FightAttri.create();
        this.calcAttri(partner);
        this.calcEquipment(partner);
        partner.fightAttri.hp = partner.fightAttri.maxHp;
        return partner;
    }

    //计算属性
    calcAttri(partner) {
        let partnerConfig = partnersConfig[partner.templateId];
        let basicAttri = partnerConfig.basicAttri;
        let lvlUpAttri = partnerConfig.lvlUpAttri;
        let fightAttri = partner.fightAttri;
        let basicInfo = partner.basicInfo;
        fightAttri.attack += basicAttri.attack; //攻击力
        fightAttri.maxHp += basicAttri.maxHp; //生命
        fightAttri.pdef += basicAttri.pdef; //防御
        fightAttri.ldef += basicAttri.ldef; //防御
        fightAttri.shield = basicAttri.shield;
        fightAttri.recover += basicAttri.recover;
        fightAttri.currentShield = basicAttri.shield;
        fightAttri.name = partner.name;
        fightAttri.con = lvlUpAttri.con * (basicInfo.lvl - 1) + basicInfo.con;
        fightAttri.str = lvlUpAttri.str * (basicInfo.lvl - 1) + basicInfo.str;
        fightAttri.will = lvlUpAttri.will * (basicInfo.lvl - 1) + basicInfo.will;
        fightAttri.sta = lvlUpAttri.sta * (basicInfo.lvl - 1) + basicInfo.sta;
        fightAttri.agile = lvlUpAttri.agile * (basicInfo.lvl - 1) + basicInfo.agile;

        for (let [attri, attriValue] of Object.entries(baseAttriConfig)) {
            for (let [key, value] of Object.entries(attriValue)) {
                fightAttri[key] += fightAttri[attri] * value
            }
        }

        fightAttri.templateId = partner.templateId;
    }

    //计算人物穿戴的装备属性
    calcEquipment(partner) {
        let fightAttri = partner.fightAttri;
        let equipments = partner.equipments;
        for (let [part, equipment] of Object.entries(partner.equipments)) {
            if (equipment) {
                let mainAttri = equipment.mainAttri;
                if (mainAttri) {
                    for (let [attri, value] of Object.entries(mainAttri)) { //主属性
                        fightAttri[attri] += value;
                    }
                }
                let addAttri = equipment.addAttri;
                if (addAttri) {
                    for (let [attri, value] of Object.entries(addAttri)) { //附加属性
                        fightAttri[attri] += value;
                    }
                }

                let specialAttri = equipment.specialAttri;
                if (specialAttri) {
                    for (let [attri, value] of Object.entries(specialAttri)) { //特殊属性
                        fightAttri[attri] += value;
                    }
                }

                // if (equipment.solt[0]) { //宝石属性
                //     let gemId = equipment.solt[0]
                //     let gemConfig = templateConfig.prop[gemId]
                //     let attri = gemConfig.attri
                //     let gemType = gemConfig.gemType
                //     if (equipment.templateId === 640000) { //头盔
                //         if (gemType === 1) {
                //             fightAttri.maxStamina += attri[2] //加成体力
                //         } else if (gemType === 2) {
                //             fightAttri.money += attri[2] //银币掉落
                //         } else if (gemType === 3) {
                //             fightAttri.lucky += attri[2] //幸运
                //         }
                //     } else if (equipment.templateId >= 510000 && equipment.templateId <= 550000) { //武器
                //         if (gemType === 1) {
                //             fightAttri.critHurt += attri[1]
                //         } else if (gemType === 2) {
                //             fightAttri.skillRate += attri[1]
                //         } else if (gemType === 3) {
                //             fightAttri.skillHurtPer += attri[1]
                //         }
                //     } else { //防具
                //         if (gemType === 1) {
                //             fightAttri.attack += attri[0]
                //         } else if (gemType === 2) {
                //             fightAttri.defend += attri[0]
                //         } else if (gemType === 3) {
                //             fightAttri.maxHp += attri[0]
                //         }
                //     }
                // }
                //强化属性
                // if (equipment.strengthenLvl > 0) {
                //     let strengthenAttri = templateConfig.strengthen[440000]
                //     for (let a in equipment.addAttri) { //附加属性
                //         fightAttri[a] += strengthenAttri[a] * equipment.strengthenLvl
                //     }
                // }
            }
        }
    }

    getFightAttri(partner) {
        return partner.fightAttri;
    }
    getFightAttriCopy(partner) {
        return FightAttri.create(partner.fightAttri)
    }
}

let partnerHandle = new PartnerHandle();
export default partnerHandle;